<?

$entrada["pagina_atual"] = 1;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 100;
$entrada["registros_por_pagina"] = 12;

$esperado["first"] = 1;
$esperado["last"] = 5;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 3;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 1;
$esperado["last"] = 5;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 4;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 2;
$esperado["last"] = 6;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 5;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 3;
$esperado["last"] = 7;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 7;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 5;
$esperado["last"] = 9;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 8;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 5;
$esperado["last"] = 9;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 8;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 12;
$entrada["por_pagina"] = 12;

$esperado["first"] = 1;
$esperado["last"] = 1;
$esperado["total_paginas"] = 1;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 8;
$entrada["qtde_paginas"] = 5;
$entrada["qtde_registros"] = 13;
$entrada["por_pagina"] = 12;

$esperado["first"] = 1;
$esperado["last"] = 2;
$esperado["total_paginas"] = 2;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 4;
$entrada["qtde_paginas"] = 6;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 2;
$esperado["last"] = 7;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 9;
$entrada["qtde_paginas"] = 6;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 4;
$esperado["last"] = 9;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 6;
$entrada["qtde_paginas"] = 6;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 4;
$esperado["last"] = 9;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

$entrada["pagina_atual"] = 5;
$entrada["qtde_paginas"] = 6;
$entrada["qtde_registros"] = 100;
$entrada["por_pagina"] = 12;

$esperado["first"] = 3;
$esperado["last"] = 8;
$esperado["total_paginas"] = 9;

$teste["entrada"] = $entrada;
$teste["esperado"] = $esperado;

$testes[] = $teste;

// @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

foreach($testes as $teste):
	extract($teste);
	$retorno = teste($entrada);
	if ($retorno != $esperado):
		echo "ENTRADA\n";
		print_r($entrada);
		echo "ESPERADO\n";
		print_r($esperado);
		echo "RETORNO\n";
		print_r($retorno);
	endif;

endforeach;

function teste($entrada)
{
	extract($entrada);

	$total_paginas = ceil($qtde_registros/$registros_por_pagina);
	// @FIXME metade de numero par da problema
	$metade = floor($qtde_paginas/2);
	$antes = $metade;
	$depois = $metade;
	if ($qtde_paginas % 2 == 0)
		$antes = $metade - 1;

	$first = min($pagina_atual - $antes, $total_paginas - $qtde_paginas + 1);
	$first = max(1, $first);
	$last = max($pagina_atual + $depois, $qtde_paginas);
	$last = min($last, $total_paginas);

	return compact("first", "last", "total_paginas");
}


?>